﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Vizzio.Models;
using Vizzio.DAL;

namespace Vizzio.Controllers
{
    public class ClienteController : Controller
    {
        private VizzioContext db = new VizzioContext();

        // GET: /Cliente/
        public ActionResult Index(int id = 0)
        {
            var clientes = db.Clientes.Where(g => g.SocioID == id);
            clientes = clientes.Where(c => c.Eliminado == false);
            ViewBag.SocioID = id;
            return View(clientes.ToList());
            //return View(db.Clientes.ToList());
        }

        public ActionResult Buscar(int id, string Ci, string Nombre, string Apellidos)
        {
            IEnumerable<Cliente> clientes = db.Clientes.ToList();
            clientes = clientes.Where(cliente => cliente.Nombre.ToLower().Contains(Nombre.ToLower()) && cliente.Apellidos.ToLower().Contains(Apellidos.ToLower()) && cliente.CI.ToString().Contains(Ci) && cliente.SocioID==id && cliente.Eliminado==false);
            ViewBag.SocioID = id;
            return View("Index", clientes.ToList());
        }

        // GET: /Cliente/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Cliente cliente = db.Clientes.Find(id);
            if (cliente == null)
            {
                return HttpNotFound();
            }
            return View(cliente);
        }

        // GET: /Cliente/Create
        public ActionResult Create(int id = 0)
        {
            //ViewBag.SocioID = new SelectList(db.Socios, "SocioID", "Apellidos");
           
            ViewBag.IDSocioSeleccionado = id;
            List<Socio> query = (from s in db.Socios
                         where s.SocioID == id && s.Eliminado==false
                         select s).ToList();
            ViewBag.nombreDeSocio = query[0].Nombre + " " + query[0].Apellidos;
            
            return View();
        }

        // POST: /Cliente/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include="ClienteID,SocioID,CI,Nombre,Apellidos,Telefono,Celular")] Cliente cliente)
        {
            cliente.Eliminado = false;
            if (ModelState.IsValid)
            {
                db.Clientes.Add(cliente);
                db.SaveChanges();
                TempData["Correcto"] = "El cliente fue registrado exitosamente!";
                return RedirectToAction("Index", new { id = cliente.SocioID });
                //return RedirectToAction("Index", new { id = gastosdeimportacion.IngresoProductoID });
            }
            TempData["Error"] = "El cliente no fue registrado, existen errores en el formulario!";
            ViewBag.IDSocioSeleccionado = cliente.SocioID;
            List<Socio> query = (from s in db.Socios
                                 where s.SocioID == cliente.SocioID && s.Eliminado==false
                                 select s).ToList();
            ViewBag.nombreDeSocio = query[0].Nombre + " " + query[0].Apellidos;
            
            return View(cliente);
        }

        // GET: /Cliente/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Cliente cliente = db.Clientes.Find(id);
            if (cliente == null)
            {
                return HttpNotFound();
            }
            ViewBag.IDSocioSeleccionado = cliente.SocioID;
            //ViewBag.Socios = new SelectList(db.Socios, "Nombre", "SocioID");
            return View(cliente);  
        }

        // POST: /Cliente/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "ClienteID,SocioID,CI,Nombre,Apellidos,Telefono,Celular")] Cliente cliente)
        {
            if (ModelState.IsValid)
            {
                db.Entry(cliente).State = EntityState.Modified;
                db.SaveChanges();
                TempData["Correcto"] = "El cliente fue modificado exitosamente!";
                return RedirectToAction("Index", new { id = cliente.SocioID });
            }
            TempData["Error"] = "El cliente no fue modificado, existen errores en el formulario!";
            return View(cliente);
        }

        // GET: /Cliente/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Cliente cliente = db.Clientes.Find(id);
            ViewBag.socioid = cliente.SocioID;
            if (cliente == null)
            {
                return HttpNotFound();
            }
            TempData["Informacion"] = "Atencion! Va a eliminar al cliente de la base de datos...";
            return View(cliente);
        }

        // POST: /Cliente/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            //List<Pedido> pedidos = (from p in db.Pedidoes
            //               where p.ClienteID == id
            //               select p).ToList();
            Cliente cliente = db.Clientes.Find(id);
            //if (pedidos.Count() == 0)
            if (cliente.sePuedeEliminar())
            {
                //Cliente cliente = db.Clientes.Find(id);
                int socioid = cliente.SocioID;
                //db.Clientes.Remove(cliente);
                cliente.Eliminado = true;
                db.Entry(cliente).State = EntityState.Modified;
                db.SaveChanges();
                TempData["Correcto"] = "El cliente fue eliminado del sistema.";
                return RedirectToAction("Index", new { id = socioid });

            }
            TempData["Correcto"] = "El cliente no puede ser eliminado porque tiene pedidos pendientes....";
            return RedirectToAction("Delete", new { id = id });

        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
